using System;
using System.Data;
using MySql.Data.MySqlClient;
using System.Collections;
using System.Collections.Specialized;
using System.Collections.Generic;
using Novapangeia.Dominio;

namespace Novapangeia.Repositorio
{	
	public partial class RepositorioTropa
	{	   
		
		private ISqlHelper sqlHelper;
		public  RepositorioTropa(ISqlHelper _sqlHelper)
        {   
            if (_sqlHelper == null)
                sqlHelper = new SqlHelper();
            else
                sqlHelper = _sqlHelper;
        }
		
		public static class Parameters
		{
			public static MySqlParameter Id
			{
				get
				{
					return new MySqlParameter("p_Id", MySqlDbType.Int32, 0);
				}
			}
			
			public static MySqlParameter Usuario_id
			{
				get
				{
					return new MySqlParameter("p_Usuario_id", MySqlDbType.Int32, 0);
				}
			}
			
			public static MySqlParameter Nome
			{
				get
				{
					return new MySqlParameter("p_Nome", MySqlDbType.VarChar, 20);
				}
			}
			
			public static MySqlParameter Guarda
			{
				get
				{
                    return new MySqlParameter("p_Guarda", MySqlDbType.Byte, 0);
				}
			}
			
			public static MySqlParameter Destino_x
			{
				get
				{
					return new MySqlParameter("p_Destino_x", MySqlDbType.Int32, 0);
				}
			}
			
			public static MySqlParameter Destino_y
			{
				get
				{
					return new MySqlParameter("p_Destino_y", MySqlDbType.Int32, 0);
				}
			}
			
		}	
		
		//=================================================================
		//  Carrega todos os registros do banco de dados
		//=================================================================
		public List<Tropa> ListarTropas() 
		{
            string sql = @"SELECT id, usuario_id, nome, guarda, destino_x, destino_y FROM tropa";
					
			List<Tropa> tropaList = new List<Tropa>();
			MySqlDataReader reader = sqlHelper.ExecuteReader(CommandType.Text, sql);
			Tropa tropa;
			
			while (reader.Read())
            {
                tropa = preencherTropa(reader);
				tropaList.Add(tropa);
            }
            reader.Close();
			
			return tropaList;
		}

		//=================================================================
		//  Carrega apenas um registro, buscado pela chave primária
		//=================================================================
        public Tropa ConsultarPorId(int Id)
        {
            string sql = @"SELECT id, usuario_id, nome, guarda, destino_x, destino_y FROM tropa WHERE (id = @p_Id)";

            MySqlParameter p;
            p = Parameters.Id;
            p.Value = Id;

            MySqlDataReader reader = sqlHelper.ExecuteReader(CommandType.Text, sql, new MySqlParameter[] { p }, CommandBehavior.SingleRow);
            Tropa tropa = new Tropa();
            if (reader.HasRows) { reader.Read(); tropa = preencherTropa(reader); }
            else { tropa = null; }
            reader.Close();
            return tropa;
        }

        private Tropa preencherTropa(MySqlDataReader r)
        {
            Tropa novaTropa = new Tropa();
			novaTropa.Id = r.GetInt32("Id");
            novaTropa.Usuario_id = r.GetInt32("Usuario_id");
            novaTropa.Nome = r.GetString("Nome");
            novaTropa.Guarda = r.GetBoolean("Guarda");
            novaTropa.Localizacao_x = r.GetInt32("Destino_x");
			novaTropa.Localizacao_y = r.GetInt32("Destino_y");
            return novaTropa;
        }
	
		public Int32 cadastrarTropa(Tropa tropa)
		{
            string sql = @"INSERT
	                        INTO tropa
	                        (
		                        usuario_id,
		                        nome,
		                        guarda,
		                        destino_x,
		                        destino_y
	                        )
	                        VALUES
	                        (
		                        @p_usuario_id,
		                        @p_nome,
		                        @p_guarda,
		                        @p_destino_x,
		                        @p_destino_y
	                        );

                            SELECT LAST_INSERT_ID();";

			List<MySqlParameter> parameters = new List<MySqlParameter>();
			
			MySqlParameter p;

		    p = Parameters.Id;
            p.Direction = ParameterDirection.InputOutput;
            parameters.Add(p);

			p = Parameters.Usuario_id;
			p.Value = tropa.Usuario_id;
			parameters.Add(p);

			p = Parameters.Nome;
			p.Value = tropa.Nome;
			parameters.Add(p);

			p = Parameters.Guarda;
			p.Value = tropa.Guarda;
			parameters.Add(p);

			p = Parameters.Destino_x;
			p.Value = tropa.Localizacao_x;
			parameters.Add(p);

			p = Parameters.Destino_y;
			p.Value = tropa.Localizacao_y;
			parameters.Add(p);

		    Object returnObject = sqlHelper.ExecuteScalar(CommandType.Text, sql, parameters.ToArray());

		    Int32 idTropa = Convert.ToInt32(returnObject);

		    return idTropa;
		}
	
		public bool atualizarTropa(Tropa tropa)
		{
            string sql = @"UPDATE tropa
	                        SET
		                        usuario_id = @p_usuario_id,
		                        nome = @p_nome,
		                        guarda = @p_guarda,
		                        destino_x = @p_destino_x,
		                        destino_y = @p_destino_y
	                        WHERE
		                        id = @p_id";

			List<MySqlParameter> parametros = new List<MySqlParameter>();
			
			MySqlParameter p;
			
			p = Parameters.Id;
			p.Value = tropa.Id;
			parametros.Add(p);

			p = Parameters.Usuario_id;
			p.Value = tropa.Usuario_id;
			parametros.Add(p);

			p = Parameters.Nome;
			p.Value = tropa.Nome;
			parametros.Add(p);

			p = Parameters.Guarda;
			p.Value = tropa.Guarda;
			parametros.Add(p);

			p = Parameters.Destino_x;
			p.Value = tropa.Localizacao_x;
			parametros.Add(p);

			p = Parameters.Destino_y;
			p.Value = tropa.Localizacao_y;
			parametros.Add(p);

            return sqlHelper.ExecuteSql(CommandType.Text, sql, parametros.ToArray());	
		}

        public List<Tropa> ListarPorUsuarioId(int idUsuario)
        {
            string sql = @"SELECT id, usuario_id, nome, guarda, destino_x, destino_y FROM tropa WHERE (usuario_id = @p_Usuario_id)";

            MySqlParameter p;
            p = Parameters.Usuario_id;
            p.Value = idUsuario;

            List<Tropa> tropaList = new List<Tropa>();

            MySqlDataReader reader = sqlHelper.ExecuteReader(CommandType.Text, sql, new [] { p });

            Tropa tropa;

            while (reader.Read())
            {
                tropa = preencherTropa(reader);
                tropaList.Add(tropa);
            }

            reader.Close();

            return tropaList;
        }
    }
}
